//
// Created by shiminli on 2024/1/3.
//

#ifndef DDOFFICE_DDREDIS_H
#define DDOFFICE_DDREDIS_H


#include <iostream>
#include <string>

#include <hiredis/hiredis.h>

using namespace std;
#define REDIS_HOST "47.94.59.114"
#define REDIS_PORT 6379
#define REDIS_PASS "1q2w3e4r"

namespace ddoffice {

    class DDRedis {
    public:
        /**
         * 获取 DDRedis 的单例实例
         * @return DDRedis 的单例实例
         */
        static DDRedis *getInstance();

        /**
         * 构造函数
         */
        DDRedis();

        /**
         * 析构函数
         */
        ~DDRedis();

        /**
         * 连接到 Redis 服务器
         * @return 连接是否成功
         */
        bool connect();

        /**
         * 从 Redis 中获取指定键的值
         * @param key 要获取值的键
         * @return 键对应的值
         */
        std::string get(const std::string &key);

        /**
         * 设置指定键的值
         * @param key 要设置值的键
         * @param value 要设置的值
         * @return 设置是否成功
         */
        int set(const std::string &key, const std::string &value);

        /**
         * 设置带过期时间的键值对
         * @param key 要设置值的键
         * @param value 要设置的值
         * @param seconds 过期时间（以秒为单位）
         * @return 设置是否成功
         */
        int setWithExpiration(const std::string &key, const std::string &value, int seconds);

        /**
         * 如果 Redis 设置了密码，则需要使用密码进行登录
         * @param password Redis 服务器的密码
         */
        int auth(std::string password);

    private:
        static DDRedis *instance; // 单例实例
        static std::mutex mtx; // 互斥锁
        redisContext *_connect; // Redis 连接
        redisReply *_reply; // Redis 命令回复
    };

}


#endif //DDOFFICE_DDREDIS_H
